deltas: Allow processing of empty delta parts
authorDan Nicholson <nicholson@endlessm.com>
Sat, 30 Jul 2016 15:14:17 +0000 (10:14 -0500)
committerAtomic Bot <atomic-devel@projectatomic.io>
Sun, 31 Jul 2016 00:01:52 +0000 (00:01 +0000)
If a static delta is generated between 2 commits with the same content,
then the delta will contain 1 part with no checksums. While useless,
this is a valid delta that shouldn't raise an assertion. If the delta
part has no checksums, then there are no objects to recreate and the
processing can be skipped.

Closes: #420
Approved by: cgwalters

src/libostree/ostree-repo-static-delta-core.c
src/libostree/ostree-repo-static-delta-processing.c

index 68c45055ba80eb15bde112d1eda51bd1819ae921..46fa5f8664daf2bc0cf2b185bf15b2774651caf7 100644 (file)
@@ -42,8 +42,7 @@ _ostree_static_delta_parse_checksum_array (GVariant      *array,
 
   n_checksums = n / OSTREE_STATIC_DELTA_OBJTYPE_CSUM_LEN;
 
-  if (G_UNLIKELY(n == 0 ||
-                 n > (G_MAXUINT32/OSTREE_STATIC_DELTA_OBJTYPE_CSUM_LEN) ||
+  if (G_UNLIKELY(n > (G_MAXUINT32/OSTREE_STATIC_DELTA_OBJTYPE_CSUM_LEN) ||
                  (n_checksums * OSTREE_STATIC_DELTA_OBJTYPE_CSUM_LEN) != n))
     {
       g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
index f78b7ab7d46814da66d58d6576ea5f7f1b253688..304d7b4ac873a7a919310bb75e6d5cd901213927 100644 (file)
@@ -210,8 +210,14 @@ _ostree_static_delta_part_execute (OstreeRepo      *repo,
                                                   error))
     goto out;
 
+  /* Skip processing for empty delta part */
+  if (state->n_checksums == 0)
+    {
+      ret = TRUE;
+      goto out;
+    }
+
   state->checksums = checksums_data;
-  g_assert (state->n_checksums > 0);
 
   g_variant_get (part, "(@a(uuu)@aa(ayay)@ay@ay)",
                  &mode_dict,